package pt.polynomials.controllers;
/**processing the polynomials: the implemented operations
* @author Chiti
*/
import java.util.Iterator;
import pt.polynomials.models.*;
public class PolynomialOperations {
/**
*
* @param monom
* @param p
* @return if monom exists in polynom p
*/
public boolean existsMonom(AbstractMonom<Integer> monom, Polynomial<Integer> p) {
for (AbstractMonom<Integer> m : p.getPolynomial())
if (m.getDegree() == monom.getDegree())
return true;
return false;
}
/**
* removes the monoms that have 0 coefficient
*
* @param p
*/
public void cleanPolynomial(Polynomial<Integer> p) {
@SuppressWarnings("rawtypes")
Iterator iterator = p.getPolynomial().iterator();
while (iterator.hasNext()) {
IntegerMonom m = (IntegerMonom) iterator.next();
if (m.getCoefficient() == 0)
iterator.remove();
}
}
/**
* add polynoms
* @param p1
* @param p2
* @return p1+p2
*/
public Polynomial<Integer> add(Polynomial<Integer> p1, Polynomial<Integer> p2) {
Polynomial<Integer> resultI = new Polynomial<Integer>();
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
for (AbstractMonom<Integer> m2 : p2.getPolynomial())
if (m1.getDegree() == m2.getDegree()) {
resultI.addMonom(new IntegerMonom(m1.getDegree(), m1.getCoefficient() + m2.getCoefficient()));
break;
}
if (!existsMonom(m1, resultI))
resultI.addMonom(new IntegerMonom(m1.getDegree(), m1.getCoefficient()));
}
for (AbstractMonom<Integer> m2 : p2.getPolynomial())
if (!existsMonom(m2, resultI))
resultI.addMonom(new IntegerMonom(m2.getDegree(), m2.getCoefficient()));
cleanPolynomial(resultI);
resultI.sortPolynomial();
return resultI;
}
/**
* substract polynoms
* @param p1
* @param p2
* @return p1-p2
*/
public Polynomial<Integer> substract(Polynomial<Integer> p1, Polynomial<Integer> p2) {
Polynomial<Integer> resultI = new Polynomial<Integer>();
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
for (AbstractMonom<Integer> m2 : p2.getPolynomial())
if (m1.getDegree() == m2.getDegree()) {
resultI.addMonom(new IntegerMonom(m1.getDegree(), m1.getCoefficient() - m2.getCoefficient()));
break;
}
if (!existsMonom(m1, resultI))
resultI.addMonom(new IntegerMonom(m1.getDegree(), m1.getCoefficient()));
}
for (AbstractMonom<Integer> m2 : p2.getPolynomial())
if (!existsMonom(m2, resultI))
resultI.addMonom(new IntegerMonom(m2.getDegree(), -m2.getCoefficient()));
cleanPolynomial(resultI);
resultI.sortPolynomial();
return resultI;
}
/**
* multiply polynoms
* @param p1
* @param p2
* @return p1*p2
*/
public Polynomial<Integer> multiply(Polynomial<Integer> p1, Polynomial<Integer> p2) {
Polynomial<Integer> resultI = new Polynomial<Integer>();
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
Polynomial<Integer> result = new Polynomial<Integer>();
for (AbstractMonom<Integer> m2 : p2.getPolynomial()) {
IntegerMonom monom = new IntegerMonom(m1.getDegree() + m2.getDegree(),
m1.getCoefficient() * m2.getCoefficient());
result.addMonom(monom);
}
resultI = add(resultI, result);
}
cleanPolynomial(resultI);
resultI.sortPolynomial();
return resultI;
}
/**
* multiplys with scalar x
* @param p1
* @param x
* @return x*p1
*/
public Polynomial<Double> multiplyScalar(Polynomial<Integer> p1, double x) {
Polynomial<Double> resultI = new Polynomial<Double>();
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
resultI.addMonom(new DoubleMonom(m1.getDegree(), m1.getCoefficient() * x));
}
resultI.sortPolynomial();
return resultI;
}
/**
* evaluates with x the polynom
* @param p1
* @param x
* @return
*/
public double evaluate(Polynomial<Integer> p1, double x) {
int result = 0;
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
result += m1.getCoefficient() * Math.pow(x, m1.getDegree());
}
return result;
}
/**
* integrates p1
* @param p1
* @return
*/
public Polynomial<Double> integrate(Polynomial<Integer> p1) {
Polynomial<Double> resultI = new Polynomial<Double>();
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
if (m1.getDegree() != 0)
resultI.addMonom(new DoubleMonom(m1.getDegree() + 1, m1.getCoefficient() / m1.getDegree()));
else
resultI.addMonom(new DoubleMonom(m1.getDegree() + 1, m1.getCoefficient()));
}
resultI.sortPolynomial();
return resultI;
}
/**
* differentiates p1
* @param p1
* @return
*/
public Polynomial<Integer> derivate(Polynomial<Integer> p1) {
Polynomial<Integer> resultI = new Polynomial<Integer>();
for (AbstractMonom<Integer> m1 : p1.getPolynomial()) {
if (m1.getDegree() != 0) {
resultI.addMonom(new IntegerMonom(m1.getDegree() - 1, m1.getCoefficient() * m1.getDegree()));
}
}
resultI.sortPolynomial();
return resultI;
}
}